package cn.kust.clock.service.impl;

import cn.kust.clock.mapper.CommentMapper;
import cn.kust.clock.pojo.dto.CommentDTO;
import cn.kust.clock.pojo.entity.Comment;
import cn.kust.clock.pojo.vo.CommentSimpleVO;
import cn.kust.clock.pojo.vo.CommentVO;
import cn.kust.clock.service.CommentService;
import cn.kust.microtourismcommon.pojo.dto.ResponseResult;
import cn.kust.microtourismcommon.pojo.dto.UserIdDTO;
import cn.kust.microtourismcommon.pojo.dto.UserNameAvatar;
import cn.kust.microtourismcommon.remote.ServiceUserCenterClient;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author YL
 * @data 2022/7/21 14:58
 **/
@Slf4j
@Service
public class CommentServiceImpl extends ServiceImpl<CommentMapper,Comment> implements CommentService {

    @Autowired
    CommentMapper commentMapper;

    @Autowired(required = false)
    ServiceUserCenterClient serviceUserClient;

    /**
     * 获取游记的评论总数
     * @param typeId 游记id
     * @return 评论总数
     */
    @Override
    public Integer getCommentCountByTravelsId(Long typeId) {
        log.info("进入获取游记评论总数的Service层");
        return commentMapper.getCommentCountByTravelsId(typeId);
    }

    /**
     * 获取打卡的评论总数
     * @param typeId 打卡id
     * @return 评论总数
     */
    @Override
    public Integer getCommentCountByClockId(Long typeId) {
        log.info("进入获取打卡评论总数的Service层");
        return commentMapper.getCommentCountByClockId(typeId);
    }


    /**
     * 根据类型与类型id查询对应的所有一级评论，按时间降序排序
     * @param type 游记或打卡类型
     * @param typeId 游记或打卡id
     * @return 一级评论列表 评论id 包括用户id 评论内容 创建时间
     */
    @Override
    public List<CommentVO> selectCommentOfLevelOne(Integer type, Long typeId) {
        log.info("进入获取一级评论的Service层");
        List<CommentSimpleVO> list = commentMapper.selectCommentOfLevelOne(type,typeId);
        log.info("list:{}",list);
        List<Long> idList = new ArrayList<>();
        log.info("开始遍历CommentSimpleVO得到id列表");
        for(CommentSimpleVO commentSimpleVO : list){
            idList.add(commentSimpleVO.getId());
        }
        log.info("idList:{}",idList);
        //远程调用获取头像和用户名
        UserIdDTO userIdDTO = new UserIdDTO();
        userIdDTO.setUserIdList(idList);
        log.info("userIdDto:{}",userIdDTO);

        ResponseResult userNameAvatarList = serviceUserClient.getUserNameAvatarList(userIdDTO);
        log.info("userNameAvatarList.getData():{}",userNameAvatarList.getData());

        List<UserNameAvatar>  userList = (List<UserNameAvatar>) userNameAvatarList.getData();
        log.info("userList:{}",userList);


        List<CommentVO> listFinal = new ArrayList<>();
        for(int i = 0; i < idList.size(); i++){
            CommentSimpleVO commentSimpleVO = list.get(i);
            CommentVO commentVO = new CommentVO();
            BeanUtils.copyProperties(commentSimpleVO, commentVO);
            //赋值
            //从list中取出来的数据需要进行转化成json格式字符串，然后再将该json格式字符串转换成对象，
            // 这样就不会再出现报错情况，能成功遍历该list列表。
            String JO = JSON.toJSONString(userList.get(i));
            UserNameAvatar userNameAvatar = JSONObject.parseObject(JO, UserNameAvatar.class);
            commentVO.setAvatar(userNameAvatar.getAvatar());
            commentVO.setUsername(userNameAvatar.getUserName());
            listFinal.add(commentVO);

        }
        return listFinal;
    }


    /**
     * 根据传入的评论id与父id字段比较，找出该评论的所有子评论，按时间降序排序
     * @param id 主键id--评论的id
     * @return 该id的子集评论列表 评论id 包括用户id 评论内容 创建时间
     */
    @Override
    public List<CommentVO> selectCommentByCommentId(Long id) {
        log.info("进入获取多级评论的Service层");
        List<CommentSimpleVO> list = commentMapper.selectCommentByCommentId(id);
        List<Long> idList = new ArrayList<>();
        log.info("开始遍历CommentSimpleVO得到id列表");
        for(CommentSimpleVO commentSimpleVO : list){
            idList.add(commentSimpleVO.getId());
        }

        log.info("idList:{}",idList);
        //远程调用获取头像和用户名
        UserIdDTO userIdDTO = new UserIdDTO();
        userIdDTO.setUserIdList(idList);
        log.info("userIdDto:{}",userIdDTO);

        ResponseResult userNameAvatarList = serviceUserClient.getUserNameAvatarList(userIdDTO);
        log.info("userNameAvatarList.getData():{}",userNameAvatarList.getData());

        List<UserNameAvatar>  userList = (List<UserNameAvatar>) userNameAvatarList.getData();
        log.info("userList:{}",userList);

        List<CommentVO> listFinal = new ArrayList<>();
        for(int i = 0; i < idList.size(); i++){
            CommentSimpleVO commentSimpleVO = list.get(i);
            CommentVO commentVO = new CommentVO();
            BeanUtils.copyProperties(commentSimpleVO, commentVO);
            //赋值
            //从list中取出来的数据需要进行转化成json格式字符串，然后再将该json格式字符串转换成对象，
            // 这样就不会再出现报错情况，能成功遍历该list列表。
            String JO = JSON.toJSONString(userList.get(i));
            UserNameAvatar userNameAvatar = JSONObject.parseObject(JO, UserNameAvatar.class);
            commentVO.setAvatar(userNameAvatar.getAvatar());
            commentVO.setUsername(userNameAvatar.getUserName());
            listFinal.add(commentVO);

        }
        return listFinal;
    }

    /**
     * 插入新评论
     * @param commentDTO 前端传来的相关新评论数据对象
     * @return 受影响行数
     */
    @Override
    public int insert(CommentDTO commentDTO) {
        log.info("进入插入评论的Service层");
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentDTO, comment);
        comment.setGmtCreate(LocalDateTime.now());
        return commentMapper.insert(comment);
    }


    /**
     * 根据id删除对应评论
     * @param id 评论id
     * @return 受影响行数
     */
    @Override
    public int delete(Long id) {
        log.info("进入删除评论的Service层");
        //判断该评论是否是该用户的，用户只能删除自己的评论
        return commentMapper.deleteById(id);
    }


}
